#Bibliotheken importieren

library(tidymodels)
Warning: Paket ‘tidymodels’ wurde unter R Version 4.1.3 erstellt
-- Attaching packages ------------------------------------------------------------------------------------------------- tidymodels 0.2.0 --
v broom        0.8.0     v recipes      0.2.0
v dials        0.1.1     v rsample      0.1.1
v dplyr        1.0.8     v tibble       3.1.6
v ggplot2      3.3.6     v tidyr        1.2.0
v infer        1.0.0     v tune         0.2.0
v modeldata    0.1.1     v workflows    0.2.6
v parsnip      0.2.1     v workflowsets 0.2.1
v purrr        0.3.4     v yardstick    0.0.9
Warning: Paket ‘broom’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘dials’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘scales’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘ggplot2’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘infer’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘modeldata’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘parsnip’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘recipes’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘rsample’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘tune’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘workflows’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘workflowsets’ wurde unter R Version 4.1.3 erstellt
Warning: Paket ‘yardstick’ wurde unter R Version 4.1.3 erstellt
-- Conflicts ---------------------------------------------------------------------------------------------------- tidymodels_conflicts() --
x purrr::discard() masks scales::discard()
x dplyr::filter()  masks stats::filter()
x dplyr::lag()     masks stats::lag()
x recipes::step()  masks stats::step()
* Dig deeper into tidy modeling with R at https://www.tmwr.org
library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
-- Attaching packages -------------------------------------------------------------------------------------------------- tidyverse 1.3.1 --
v readr   2.1.2     v forcats 0.5.1
v stringr 1.4.0     
-- Conflicts ----------------------------------------------------------------------------------------------------- tidyverse_conflicts() --
x readr::col_factor() masks scales::col_factor()
x purrr::discard()    masks scales::discard()
x dplyr::filter()     masks stats::filter()
x stringr::fixed()    masks recipes::fixed()
x dplyr::lag()        masks stats::lag()
x readr::spec()       masks yardstick::spec()
library(plotly)
Warning: Paket ‘plotly’ wurde unter R Version 4.1.3 erstellt
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio

Attache Paket: ‘plotly’

Das folgende Objekt ist maskiert ‘package:ggplot2’:

    last_plot

Das folgende Objekt ist maskiert ‘package:stats’:

    filter

Das folgende Objekt ist maskiert ‘package:graphics’:

    layout
library(esquisse)
Warning: Paket ‘esquisse’ wurde unter R Version 4.1.3 erstellt
library(highcharter)
Warning: Paket ‘highcharter’ wurde unter R Version 4.1.3 erstellt
Registered S3 method overwritten by 'quantmod':
  method            from
  as.zoo.data.frame zoo 
library(formattable)
Warning: Paket ‘formattable’ wurde unter R Version 4.1.3 erstellt

Attache Paket: ‘formattable’

Das folgende Objekt ist maskiert ‘package:plotly’:

    style

Die folgenden Objekte sind maskiert von ‘package:scales’:

    comma, percent, scientific
library(rpart)

Attache Paket: ‘rpart’

Das folgende Objekt ist maskiert ‘package:dials’:

    prune
library(rpart.plot)
Warning: Paket ‘rpart.plot’ wurde unter R Version 4.1.3 erstellt
#Datensatz einlesen
df_original <- read.csv("https://swissvotes.ch/page/dataset/swissvotes_dataset.csv", header=TRUE, sep=";", na = c("NA", "."))
```r
parteien <- c(\.svp\, \.fdp\, \.sps\, \.cvp\, \.gps\, \.mitte\)

#Daten selektieren
df <- df %>%
  select(datum, titel_off_d, anzahl, rechtsform, d1e1:br.pos, bv.pos:srnein, unter.quorum, unter_g, unter_u, ends_with(parteien), ja.lager:neutral.summe, volk:ktjaproz) %>%
  mutate(datum = as.Date(datum, \%d.%m.%Y\)) %>% 
  mutate(p.cvp = ifelse(p.cvp == 9999, p.mitte, p.cvp))%>% #CVP wurde zu Mitte -> fehlende Daten cvp durch Daten der Mitte ergänzt
  mutate(w.cvp = ifelse(w.cvp == 0, w.mitte, w.cvp))%>%  #CVP wurde zu Mitte -> fehlende Daten cvp durch Daten der Mitte ergänzt
  rename(p.cvp_mitte = p.cvp, w.cvp_mitte = w.cvp)  %>% 
  select(-c(p.mitte, w.mitte))

#Themen vom Mai 
mai <- df %>%
  filter(datum > as.Date(\01.05.2022\, \%d.%m.%Y\ )) %>%
  select(d1e1:d3e3)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->




<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuI1ZhcmlhYmxlbiBkZWZpbmllcmVuIHVtIG5hY2hoZXIgbWVocmVyZSBTcGFsdGVuIGdsZWljaHplaXRpZyB6dSBtdXRpZXJlblxucG9zaXRpb25lbiAgPC0gZGYgJT4lXG4gIHNlbGVjdChlbmRzX3dpdGgoXCIucG9zXCIpfHN0YXJ0c193aXRoKFwicC5cIil8c3RhcnRzX3dpdGgoXCJwZGV2XCIpKSBcblxuaGF1cHR0aGVtYSA8LSBkZiAlPiVcbiAgc2VsZWN0KGQxZTEsIGQyZTEgLGQzZTEpXG5cbnVudGVydGhlbWEgPC0gZGYgJT4lXG4gIHNlbGVjdChkMWUyLCBkMmUyICxkM2UyKVxuXG5kYXRlbiA8LSBkZiAlPiVcbiAgc2VsZWN0KGRhdHVtLCBzdGFydHNfd2l0aChcImRhdC5cIikpXG5cbnJlc3VsdGF0ZSA8LSBkZiAlPiVcbiAgc2VsZWN0KGVuZHNfd2l0aChcImFubmFobWVcIil8IHZvbGsgfCBzdGFuZClcblxuI2JlcmVpbmlndGVuIERhdGVuc2F0eiBlcnN0ZWxsZW4gKFZhcmlhYmxlbiBiZW5lbm5lbiwgU3BhbHRlbiB1bWJlbmVubmVuKVxuZGZfY2xlYW4gPC0gZGYgJT4lXG4gIG11dGF0ZShyZWNodHNmb3JtID0gZmFjdG9yKGNhc2Vfd2hlbihcbiAgICByZWNodHNmb3JtID09IDEgfiBcIk9ibGlnYXRvcmlzY2hlcyBSZWZlcmVuZHVtXCIsICNPUlxuICAgIHJlY2h0c2Zvcm0gPT0gMiB+IFwiRmFrdWx0YXRpdmVzIFJlZmVyZW5kdW1cIiwgI0ZSXG4gICAgcmVjaHRzZm9ybSA9PSAzIH4gXCJWb2xrc2luaXRpYXRpdmVcIiwgI1ZJXG4gICAgcmVjaHRzZm9ybSA9PSA0IH4gXCJHZWdlbmVudHd1cmYgenUgVm9sa3Npbml0aWF0aXZlXCIsICNHVlxuICAgIHJlY2h0c2Zvcm0gPT0gNSB+IFwiU3RpY2hmcmFnZVwiKSkpJT4lICAjU1xuICBtdXRhdGUoYWNyb3NzKG5hbWVzKHBvc2l0aW9uZW4pLCBcbiAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMSB+IFwiQmVmw7xyd29ydGVuZFwiLFxuICAgIC49PSAyIH5cIkFibGVobmVuZFwiLFxuICAgIC49PSAzIH5cIktlaW5lXCIsXG4gICAgLj09IDQgflwiTGVlcmUgQWJnYWJlXCIsXG4gICAgLj09IDUgflwiU3RpbW1mcmVpZ2FiZVwiLFxuICAgIC49PSA4IH5cIlZvcnp1ZyBmw7xyIGRlbiBHZWdlbmVudHd1cmZcIixcbiAgICAuPT0gOSB+XCJWb3J6dWcgZsO8ciBWb2xrc2luaXRpYXRpdmVcIixcbiAgICAuID09IDY2IH5cImtlaW5lXCIsXG4gICAgLiA9PSA5OTk5IH5cIlBhcnRlaSBleC4gbmljaHRcIiwpKSkpICU+JVxuICBtdXRhdGUoYWNyb3NzKG5hbWVzKHJlc3VsdGF0ZSksIFxuICAgICAgICAgICAgICAgIH4gZmFjdG9yKGNhc2Vfd2hlbiguID09IDAgflwiYWJnZWxlaG50XCIsIFxuICAgICAgICAgICAgICAgIC49PSAxIH4gXCJhbmdlbm9tbWVuXCIsIFxuICAgICAgICAgICAgICAgIC49PSAzIH4gXCJTdMOkbmRlbWVociBuaWNodCBuw7Z0aWdcIiwgXG4gICAgICAgICAgICAgICAgLj09IDggfiBcIkdlZ2VuZW50d3VyZiBhbmdlbm9tbWVuXCIsIFxuICAgICAgICAgICAgICAgIC49PSA5IH4gXCJWb2xrc2luaXRpYXRpdmUgYW5nZW5vbW1lblwiICkpKSkgXG5cblxuXG5kYXRhX21haSA8LSBkZl9jbGVhbiAlPiVcbiAgZmlsdGVyKGRhdHVtID4gYXMuRGF0ZShcIjAxLjA1LjIwMjJcIiwgXCIlZC4lbS4lWVwiICkpIFxuXG5gYGAifQ== -->

```r
#Variablen definieren um nachher mehrere Spalten gleichzeitig zu mutieren
positionen  <- df %>%
  select(ends_with(".pos")|starts_with("p.")|starts_with("pdev")) 

hauptthema <- df %>%
  select(d1e1, d2e1 ,d3e1)

unterthema <- df %>%
  select(d1e2, d2e2 ,d3e2)

daten <- df %>%
  select(datum, starts_with("dat."))

resultate <- df %>%
  select(ends_with("annahme")| volk | stand)

#bereinigten Datensatz erstellen (Variablen benennen, Spalten umbenennen)
df_clean <- df %>%
  mutate(rechtsform = factor(case_when(
    rechtsform == 1 ~ "Obligatorisches Referendum", #OR
    rechtsform == 2 ~ "Fakultatives Referendum", #FR
    rechtsform == 3 ~ "Volksinitiative", #VI
    rechtsform == 4 ~ "Gegenentwurf zu Volksinitiative", #GV
    rechtsform == 5 ~ "Stichfrage")))%>%  #S
  mutate(across(names(positionen), 
           ~ factor(case_when(. == 1 ~ "Befürwortend",
    .== 2 ~"Ablehnend",
    .== 3 ~"Keine",
    .== 4 ~"Leere Abgabe",
    .== 5 ~"Stimmfreigabe",
    .== 8 ~"Vorzug für den Gegenentwurf",
    .== 9 ~"Vorzug für Volksinitiative",
    . == 66 ~"keine",
    . == 9999 ~"Partei ex. nicht",)))) %>%
  mutate(across(names(resultate), 
                ~ factor(case_when(. == 0 ~"abgelehnt", 
                .== 1 ~ "angenommen", 
                .== 3 ~ "Ständemehr nicht nötig", 
                .== 8 ~ "Gegenentwurf angenommen", 
                .== 9 ~ "Volksinitiative angenommen" )))) 



data_mai <- df_clean %>%
  filter(datum > as.Date("01.05.2022", "%d.%m.%Y" )) 
n_FR_angenommen / n_angenommen
       n 
0.368254 

#Visualisierung mittels Boxplot
Unterschriften <- df_clean %>% filter(rechtsform == "Fakultatives Referendum", !is.na(annahme)) %>% ggplot(aes(annahme, unter_g)) + geom_boxplot()

ggplotly(Unterschriften)


jalager <- df_clean %>% filter( !is.na(annahme)) %>% ggplot(aes(annahme, ja.lager)) + geom_boxplot()

ggplotly(jalager)
Warning: Removed 34 rows containing non-finite values (stat_boxplot).
ggplot(df_clean, aes(annahme, ja.lager)) + geom_jitter()
Warning: Removed 34 rows containing missing values (geom_point).

vorhersagen <- vorhersagen %>% 
  select(-c(nr.pos, sr.pos, bv.pos)) %>% 
  rename(Titel = titel_kurz_d)
Error in `select()`:
! Can't subset columns that don't exist.
x Column `nr.pos` doesn't exist.
Backtrace:
  1. vorhersagen %>% select(-c(nr.pos, sr.pos, bv.pos)) %>% ...
  4. dplyr:::select.data.frame(., -c(nr.pos, sr.pos, bv.pos))
  7. tidyselect::eval_select(expr(c(...)), .data)
  8. tidyselect:::eval_select_impl(...)
 17. tidyselect:::vars_select_eval(...)
     ...
 27. tidyselect:::chr_as_locations(x, vars, call = call)
 28. vctrs::vec_as_location(x, n = length(vars), names = vars)
 29. vctrs `<fn>`()
 30. vctrs:::stop_subscript_oob(...)
 31. vctrs:::stop_subscript(...)
#Entscheidungsbaum nur mit rpart (da Baum sonst nicht geplottet werden konnte)
model <- rpart(annahme ~ ., data = data_baum, method = 'class',control=rpart.control(minsplit = 12, minbucket = 10, cp=0.009))

predict(model, data_mai_baum, type = 'class')
         1          2          3 
 abgelehnt angenommen angenommen 
Levels: abgelehnt angenommen
predict(model, organspende, type = 'class')
         1 
angenommen 
Levels: abgelehnt angenommen
predict(model, Frontex, type = 'class')
         1 
angenommen 
Levels: abgelehnt angenommen
predict(model, filmgesetz, type = 'class')
        1 
abgelehnt 
Levels: abgelehnt angenommen
rpart.plot(model, extra = "auto")

NA
NA
NA
#Visualisierung Verteilung der Rechtsformen
ggplot(df_clean, aes(x = rechtsform)) +
  geom_bar()

NA
NA
mean(df_clean$rechtsform)
Warning in mean.default(df_clean$rechtsform) :
  Argument ist weder numerisch noch boolesch: gebe NA zurück
[1] NA
LS0tDQp0aXRsZTogIk1pbmkgQ2hhbGxlbmdlIHdlcjogVm9yaGVyc2FnZSBBYnN0aW1tdW5nZW4gTWFpIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQotLS0NCg0KYGBge3J9DQojQmlibGlvdGhla2VuIGltcG9ydGllcmVuDQoNCmxpYnJhcnkodGlkeW1vZGVscykNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShwbG90bHkpDQpsaWJyYXJ5KGVzcXVpc3NlKQ0KbGlicmFyeShoaWdoY2hhcnRlcikNCmxpYnJhcnkoZm9ybWF0dGFibGUpDQpsaWJyYXJ5KHJwYXJ0KQ0KbGlicmFyeShycGFydC5wbG90KQ0KDQpgYGANCg0KDQpgYGB7cn0NCiNEYXRlbnNhdHogZWlubGVzZW4NCmRmX29yaWdpbmFsIDwtIHJlYWQuY3N2KCJodHRwczovL3N3aXNzdm90ZXMuY2gvcGFnZS9kYXRhc2V0L3N3aXNzdm90ZXNfZGF0YXNldC5jc3YiLCBoZWFkZXI9VFJVRSwgc2VwPSI7IiwgbmEgPSBjKCJOQSIsICIuIikpDQpgYGANCg0KYGBge3J9DQpwYXJ0ZWllbiA8LSBjKCIuc3ZwIiwgIi5mZHAiLCAiLnNwcyIsICIuY3ZwIiwgIi5ncHMiLCAiLm1pdHRlIikNCg0KI0RhdGVuIHNlbGVrdGllcmVuDQpkZiA8LSBkZl9vcmlnaW5hbCAlPiUNCiAgc2VsZWN0KGRhdHVtLCB0aXRlbF9rdXJ6X2QsIGFuemFobCwgcmVjaHRzZm9ybSwgZDFlMTpici5wb3MsIGJ2LnBvczpzcm5laW4sIHVudGVyLnF1b3J1bSwgdW50ZXJfZywgdW50ZXJfdSwgZW5kc193aXRoKHBhcnRlaWVuKSwgamEubGFnZXI6bmV1dHJhbC5zdW1tZSwgdm9sazprdGphcHJveikgJT4lDQogIG11dGF0ZShkYXR1bSA9IGFzLkRhdGUoZGF0dW0sICIlZC4lbS4lWSIpKSAlPiUgDQogIG11dGF0ZShwLmN2cCA9IGlmZWxzZShwLmN2cCA9PSA5OTk5LCBwLm1pdHRlLCBwLmN2cCkpJT4lICNDVlAgd3VyZGUgenUgTWl0dGUgLT4gZmVobGVuZGUgRGF0ZW4gY3ZwIGR1cmNoIERhdGVuIGRlciBNaXR0ZSBlcmfDpG56dA0KICBtdXRhdGUody5jdnAgPSBpZmVsc2Uody5jdnAgPT0gMCwgdy5taXR0ZSwgdy5jdnApKSU+JSAgI0NWUCB3dXJkZSB6dSBNaXR0ZSAtPiBmZWhsZW5kZSBEYXRlbiBjdnAgZHVyY2ggRGF0ZW4gZGVyIE1pdHRlIGVyZ8Okbnp0DQogIHJlbmFtZShwLmN2cF9taXR0ZSA9IHAuY3ZwLCB3LmN2cF9taXR0ZSA9IHcuY3ZwKSAgJT4lIA0KICBzZWxlY3QoLWMocC5taXR0ZSwgdy5taXR0ZSkpDQoNCiNUaGVtZW4gdm9tIE1haSANCm1haSA8LSBkZiAlPiUNCiAgZmlsdGVyKGRhdHVtID4gYXMuRGF0ZSgiMDEuMDUuMjAyMiIsICIlZC4lbS4lWSIgKSkgJT4lDQogIHNlbGVjdChkMWUxOmQzZTMpDQoNCg0KDQpgYGANCg0KDQpgYGB7cn0NCiNWYXJpYWJsZW4gZGVmaW5pZXJlbiB1bSBuYWNoaGVyIG1laHJlcmUgU3BhbHRlbiBnbGVpY2h6ZWl0aWcgenUgbXV0aWVyZW4NCnBvc2l0aW9uZW4gIDwtIGRmICU+JQ0KICBzZWxlY3QoZW5kc193aXRoKCIucG9zIil8c3RhcnRzX3dpdGgoInAuIil8c3RhcnRzX3dpdGgoInBkZXYiKSkgDQoNCmhhdXB0dGhlbWEgPC0gZGYgJT4lDQogIHNlbGVjdChkMWUxLCBkMmUxICxkM2UxKQ0KDQp1bnRlcnRoZW1hIDwtIGRmICU+JQ0KICBzZWxlY3QoZDFlMiwgZDJlMiAsZDNlMikNCg0KZGF0ZW4gPC0gZGYgJT4lDQogIHNlbGVjdChkYXR1bSwgc3RhcnRzX3dpdGgoImRhdC4iKSkNCg0KcmVzdWx0YXRlIDwtIGRmICU+JQ0KICBzZWxlY3QoZW5kc193aXRoKCJhbm5haG1lIil8IHZvbGsgfCBzdGFuZCkNCg0KI2JlcmVpbmlndGVuIERhdGVuc2F0eiBlcnN0ZWxsZW4gKFZhcmlhYmxlbiBiZW5lbm5lbiwgU3BhbHRlbiB1bWJlbmVubmVuKQ0KZGZfY2xlYW4gPC0gZGYgJT4lDQogIG11dGF0ZShyZWNodHNmb3JtID0gZmFjdG9yKGNhc2Vfd2hlbigNCiAgICByZWNodHNmb3JtID09IDEgfiAiT2JsaWdhdG9yaXNjaGVzIFJlZmVyZW5kdW0iLCAjT1INCiAgICByZWNodHNmb3JtID09IDIgfiAiRmFrdWx0YXRpdmVzIFJlZmVyZW5kdW0iLCAjRlINCiAgICByZWNodHNmb3JtID09IDMgfiAiVm9sa3Npbml0aWF0aXZlIiwgI1ZJDQogICAgcmVjaHRzZm9ybSA9PSA0IH4gIkdlZ2VuZW50d3VyZiB6dSBWb2xrc2luaXRpYXRpdmUiLCAjR1YNCiAgICByZWNodHNmb3JtID09IDUgfiAiU3RpY2hmcmFnZSIpKSklPiUgICNTDQogIG11dGF0ZShhY3Jvc3MobmFtZXMocG9zaXRpb25lbiksIA0KICAgICAgICAgICB+IGZhY3RvcihjYXNlX3doZW4oLiA9PSAxIH4gIkJlZsO8cndvcnRlbmQiLA0KICAgIC49PSAyIH4iQWJsZWhuZW5kIiwNCiAgICAuPT0gMyB+IktlaW5lIiwNCiAgICAuPT0gNCB+IkxlZXJlIEFiZ2FiZSIsDQogICAgLj09IDUgfiJTdGltbWZyZWlnYWJlIiwNCiAgICAuPT0gOCB+IlZvcnp1ZyBmw7xyIGRlbiBHZWdlbmVudHd1cmYiLA0KICAgIC49PSA5IH4iVm9yenVnIGbDvHIgVm9sa3Npbml0aWF0aXZlIiwNCiAgICAuID09IDY2IH4ia2VpbmUiLA0KICAgIC4gPT0gOTk5OSB+IlBhcnRlaSBleC4gbmljaHQiLCkpKSkgJT4lDQogIG11dGF0ZShhY3Jvc3MobmFtZXMocmVzdWx0YXRlKSwgDQogICAgICAgICAgICAgICAgfiBmYWN0b3IoY2FzZV93aGVuKC4gPT0gMCB+ImFiZ2VsZWhudCIsIA0KICAgICAgICAgICAgICAgIC49PSAxIH4gImFuZ2Vub21tZW4iLCANCiAgICAgICAgICAgICAgICAuPT0gMyB+ICJTdMOkbmRlbWVociBuaWNodCBuw7Z0aWciLCANCiAgICAgICAgICAgICAgICAuPT0gOCB+ICJHZWdlbmVudHd1cmYgYW5nZW5vbW1lbiIsIA0KICAgICAgICAgICAgICAgIC49PSA5IH4gIlZvbGtzaW5pdGlhdGl2ZSBhbmdlbm9tbWVuIiApKSkpIA0KDQoNCg0KZGF0YV9tYWkgPC0gZGZfY2xlYW4gJT4lDQogIGZpbHRlcihkYXR1bSA+IGFzLkRhdGUoIjAxLjA1LjIwMjIiLCAiJWQuJW0uJVkiICkpIA0KDQpgYGANCg0KDQpgYGB7cn0NCiNWYXJpYWJsZW4gesOkaGxlbiAvIGVpbnplbG5lIFdhaHJzY2hlaW5saWNoa2VpdGVuIGJlcmVjaG5lbg0Kbl9GUiA8LSB1bmxpc3QoZGZfY2xlYW4gJT4lIGZpbHRlcihyZWNodHNmb3JtID09ICJGYWt1bHRhdGl2ZXMgUmVmZXJlbmR1bSIpICU+JSBjb3VudCgpKQ0Kbl9hbmdlbm9tbWVuIDwtdW5saXN0KGRmX2NsZWFuICU+JSBmaWx0ZXIoYW5uYWhtZSA9PSAiYW5nZW5vbW1lbiIpICU+JSBjb3VudCgpKSANCm5fYWJnZWxlaG50IDwtIHRvdGFsX3ZvcmxhZ2VuIC0gbl9hbmdlbm9tbWVuDQpuX0ZSX2FuZ2Vub21tZW4gPC11bmxpc3QoZGZfY2xlYW4gJT4lIGZpbHRlcihyZWNodHNmb3JtID09ICJGYWt1bHRhdGl2ZXMgUmVmZXJlbmR1bSIsIGFubmFobWUgPT0gImFuZ2Vub21tZW4iKSAlPiUgY291bnQoKSkNCm5fRlJfYWJnZWxlaG50IDwtIG5fRlIgLSBuX0ZSX2FuZ2Vub21tZW4NCnRvdGFsX3ZvcmxhZ2VuIDwtIHVubGlzdChkZl9jbGVhbiAlPiUgY291bnQoKSkgDQoocHJvYl9GUl9hbm5haG1lIDwtIHBlcmNlbnQobl9GUl9hbmdlbm9tbWVuIC8gbl9GUikpDQoocHJvYl9GUl9hbm5haG1lIDwtIHBlcmNlbnQobl9GUl9hbmdlbm9tbWVuIC8gdG90YWxfdm9ybGFnZW4pKQ0KKHByb2JfYW5uYWhtZSA8LSBuX2FuZ2Vub21tZW4gLyB0b3RhbF92b3JsYWdlbikNCihwcm9iX0ZSIDwtIG5fRlIgLyB0b3RhbF92b3JsYWdlbikNCg0KDQojS3JldXp0YWJlbGxlbiBtaXQgQW56YWhsDQp0YWJsZShkZl9jbGVhbiRyZWNodHNmb3JtLCBkZl9jbGVhbiRici5wb3MpDQoNCg0KUEUgPC0gMTE2LzMxNSAjQW56YWhsIEZSIGFuZ2Vub21tZW4gLyBBbnphaGwgYW5nZW5vbW1lbmUNClBFTiA8LSA4OS8zNjEgI0FuemFobCBGUiBhYmdlbGVobnQgLyBhbnouIGFiZ2VsZWhudA0KDQpQRSAvIChQRStQRU4pDQoNCm5fRlJfYW5nZW5vbW1lbiAvIG5fYW5nZW5vbW1lbg0KDQojV2FocnNjaGVpbmxpY2hrZWl0ZW4gZsO8ciBkaWUgUG9zaXRpb25lbiB2b20gQlIsIGFiaMOkbmdpZyB2b24gZGVyIFJlY2h0c2Zvcm0NCnByb2JfYnIgPC0gZGZfY2xlYW4gJT4lIA0KICBzZWxlY3QocmVjaHRzZm9ybSwgYnIucG9zKSAlPiUgDQogIGNvdW50KHJlY2h0c2Zvcm0sIGJyLnBvcykgJT4lDQogIG11dGF0ZShwcm9iID0gcGVyY2VudChuL3N1bShuKSkpDQogICNzdW1tYXJpc2UocHJvYiA9IGNvdW50KC4pKQ0KICANCiN3YWhyc2NoZWlubGljaGtlaXQsIGRhc3Mgdm9sayBqYSBzYWd0IGJlaSBiZWbDvHJ3b3J0ZW5kZXIgSGFsdHVuZyBkZXMgQlIgDQpwcm9iX3ZvbGtfYnIgPC0gZGZfY2xlYW4gJT4lIA0KICBmaWx0ZXIoYnIucG9zID09ICJCZWbDvHJ3b3J0ZW5kIikgJT4lIA0KICBzZWxlY3QoYnIucG9zLCB2b2xrKSAlPiUgDQogICNncm91cF9ieShyZWNodHNmb3JtLCB2b2xrKSAlPiUgDQogIGNvdW50KGJyLnBvcywgdm9saykgJT4lIA0KICBtdXRhdGUocHJvYiA9IHBlcmNlbnQobi9zdW0obikpKQ0KDQoNCiNXYWhyc2NoZWlubGljaGtlaXQsIGRhc3MgVm9ybGFnZSBPcmdhbnNwZW5kZSBhbmdlbm9tbWVuIHdpcmQgKGJlcsO8Y2tzaWNodGlnZSBGYWt0b3JlbjogUmVjaHRzZm9ybSwgQlIgUG9zKQ0KDQoNCiN3YWhyc2NoZWlubGljaGtlaXQgZGFzcyB2b2xrIGphIHN0aW1tdCBiZWkgZmFrLiByZWZlcmVuZHVtDQpwcm9iX3ZvbGtfRlIgPC0gZGZfY2xlYW4gJT4lIA0KICBmaWx0ZXIocmVjaHRzZm9ybSA9PSAiRmFrdWx0YXRpdmVzIFJlZmVyZW5kdW0iKSAlPiUgDQogIHNlbGVjdChyZWNodHNmb3JtLCB2b2xrKSAlPiUgDQogICNncm91cF9ieShyZWNodHNmb3JtLCB2b2xrKSAlPiUgDQogIGNvdW50KHJlY2h0c2Zvcm0sIHZvbGspICU+JSANCiAgbXV0YXRlKHByb2IgPSBwZXJjZW50KG4vc3VtKG4pKSkNCg0KDQojd2FocnNjaGVpbmxpY2hrZWl0LCBkYXNzIHN0w6RuZGUgamEgc2FndCBiZWkgYmVmw7xyd29ydGVuZGVyIEhhbHR1bmcgZGVzIEJSIA0KcHJvYl9zdGFuZF9iciA8LSBkZl9jbGVhbiAlPiUgDQogIGZpbHRlcihici5wb3MgPT0gIkJlZsO8cndvcnRlbmQiKSAlPiUgDQogIHNlbGVjdChici5wb3MsIHN0YW5kKSAlPiUgDQogICNncm91cF9ieShyZWNodHNmb3JtLCB2b2xrKSAlPiUgDQogIGNvdW50KGJyLnBvcywgc3RhbmQpICU+JSANCiAgbXV0YXRlKHByb2IgPSBwZXJjZW50KG4vc3VtKG4pKSkNCg0KI3dhaHJzY2hlaW5saWNoa2VpdCwgZGFzcyBzdMOkbmRlIGphIHNhZ3QgYmVpIEZhayBSZWYgKHJlc3VsdGF0IC0+IFN0w6RuZGVtZWhyIG5pY2h0IG7DtnRpZykNCnByb2Jfc3RhbmRfRlIgPC0gZGZfY2xlYW4gJT4lIA0KICBmaWx0ZXIocmVjaHRzZm9ybSA9PSAiRmFrdWx0YXRpdmVzIFJlZmVyZW5kdW0iKSAlPiUgDQogIHNlbGVjdChyZWNodHNmb3JtLCBzdGFuZCkgJT4lIA0KICAjZ3JvdXBfYnkocmVjaHRzZm9ybSwgdm9saykgJT4lIA0KICBjb3VudChyZWNodHNmb3JtLCBzdGFuZCkgJT4lIA0KICBtdXRhdGUocHJvYiA9IHBlcmNlbnQobi9zdW0obikpKQ0KDQoNCiNXYWhyc2NoZWlubGljaGtlaXRlbiwgZGFzcyBldHdhcyBhbmdlbm9tbWVuIHdpcmQgd2VubiBCUiBqYSBzYWd0IC8gRm9ybSA9IEZhay4gUmVmIC8gRm9ybSA9IFZvbGtzaW5pdGlhdGl2ZQ0KcmVzdWx0YXRfYnIgPC0gZGZfY2xlYW4gJT4lIA0KICBmaWx0ZXIoYnIucG9zID09ICJCZWbDvHJ3b3J0ZW5kIikgJT4lIA0KICBzZWxlY3QoYnIucG9zLCBhbm5haG1lKSAlPiUgDQogICNncm91cF9ieShyZWNodHNmb3JtLCB2b2xrKSAlPiUgDQogIGNvdW50KGJyLnBvcywgYW5uYWhtZSkgJT4lIA0KICBtdXRhdGUocHJvYiA9IHBlcmNlbnQobi9zdW0obikpKQ0KDQoNCnJlc3VsdGF0X0ZSIDwtIGRmX2NsZWFuICU+JSANCiAgZmlsdGVyKHJlY2h0c2Zvcm0gPT0gIkZha3VsdGF0aXZlcyBSZWZlcmVuZHVtIikgJT4lIA0KICBzZWxlY3QocmVjaHRzZm9ybSwgYW5uYWhtZSkgJT4lIA0KICAjZ3JvdXBfYnkocmVjaHRzZm9ybSwgdm9saykgJT4lIA0KICBjb3VudChyZWNodHNmb3JtLCBhbm5haG1lKSAlPiUgDQogIG11dGF0ZShwcm9iID0gcGVyY2VudChuL3N1bShuKSkpDQoNCg0KcmVzdWx0YXRfVkkgPC0gZGZfY2xlYW4gJT4lIA0KICBmaWx0ZXIocmVjaHRzZm9ybSA9PSAiVm9sa3Npbml0aWF0aXZlIikgJT4lIA0KICBzZWxlY3QocmVjaHRzZm9ybSwgYW5uYWhtZSkgJT4lIA0KICAjZ3JvdXBfYnkocmVjaHRzZm9ybSwgdm9saykgJT4lIA0KICBjb3VudChyZWNodHNmb3JtLCBhbm5haG1lKSAlPiUgDQogIG11dGF0ZShwcm9iID0gcGVyY2VudChuL3N1bShuKSkpDQoNCmJ2X2JyIDwtIGRmX2NsZWFuICU+JSANCiAgc2VsZWN0KHRpdGVsX29mZl9kLCBici5wb3MsIGJ2LnBvcywgbnIucG9zLCBzci5wb3MpICU+JSANCiAgbXV0YXRlKGtvbmtvcmRhbnogPSBpZmVsc2UoYnIucG9zID09IGJyLnBvcyAmIGJyLnBvcyA9PSBuci5wb3MgJiBuci5wb3MgPT0gc3IucG9zLCAiamEiLCAibmVpbiIpKQ0KDQoNCg0KZ2dwbG90KGRmX2NsZWFuLCBhZXMocmVjaHRzZm9ybSwgZmlsbCA9IGFubmFobWUpKSsgZ2VvbV9iYXIoKQ0KZ2dwbG90KGRmX2NsZWFuLCBhZXMoYnYucG9zLCBmaWxsID0gYW5uYWhtZSkpKyBnZW9tX2JhcigpDQoNCmBgYA0KDQoNCmBgYHtyfQ0KDQojVmlzdWFsaXNpZXJ1bmcgRWluZmx1c3MgbWl0dGVscyBCb3hwbG90DQpVbnRlcnNjaHJpZnRlbiA8LSBkZl9jbGVhbiAlPiUgZmlsdGVyKHJlY2h0c2Zvcm0gPT0gIkZha3VsdGF0aXZlcyBSZWZlcmVuZHVtIiwgIWlzLm5hKGFubmFobWUpKSAlPiUgZ2dwbG90KGFlcyhhbm5haG1lLCB1bnRlcl9nKSkgKyBnZW9tX2JveHBsb3QoKQ0KZ2dwbG90bHkoVW50ZXJzY2hyaWZ0ZW4pDQoNCg0KamFsYWdlciA8LSBkZl9jbGVhbiAlPiUgZmlsdGVyKCAhaXMubmEoYW5uYWhtZSkpICU+JSBnZ3Bsb3QoYWVzKGFubmFobWUsIGphLmxhZ2VyKSkgKyBnZW9tX2JveHBsb3QoKQ0KZ2dwbG90bHkoamFsYWdlcikNCg0KDQpgYGANCg0KDQpgYGB7cn0gDQojRW50c2NoZWlkdW5nc2JhdW0NCiNyZWR1emllcnRlciBEYXRlbnNhdHo6DQpkYXRhX2JhdW0gPC0gZGZfY2xlYW4gJT4lIA0KICBzZWxlY3QocmVjaHRzZm9ybSwgYnIucG9zLCBidi5wb3MsIG5yLnBvcywgc3IucG9zLCBqYS5sYWdlciwgYW5uYWhtZSkgDQoNCmRhdGFfbWFpX2JhdW0gPC0gZGF0YV9tYWkgJT4lIA0KICBzZWxlY3QodGl0ZWxfa3Vyel9kLHJlY2h0c2Zvcm0sIGJyLnBvcywgYnYucG9zLCBuci5wb3MsIHNyLnBvcywgIGphLmxhZ2VyLCBhbm5haG1lKQ0KICANCm9yZ2Fuc3BlbmRlIDwtIGRhdGFfbWFpX2JhdW0gJT4lICBmaWx0ZXIodGl0ZWxfa3Vyel9kID09IldpZGVyc3BydWNoc3JlZ2VsdW5nIGJlaSBkZXIgT3JnYW5zcGVuZGUiKQ0KRnJvbnRleCA8LSBkYXRhX21haV9iYXVtICU+JSAgZmlsdGVyKHRpdGVsX2t1cnpfZCA9PSAiQmV0ZWlsaWd1bmcgYW4gZGVyIGV1cm9ww6Rpc2NoZW4gR3JlbnotIHVuZCBLw7xzdGVud2FjaGUgRnJvbnRleCIpIA0KZmlsbWdlc2V0eiA8LSBkYXRhX21haV9iYXVtICU+JSAgZmlsdGVyKHRpdGVsX2t1cnpfZCA9PSAiw4RuZGVydW5nIGRlcyBGaWxtZ2VzZXR6ZXMiKSANCg0KDQpzZXQuc2VlZCgxMjM0KQ0KZGF0YV9zcGxpdCA8LSBpbml0aWFsX3NwbGl0KGRhdGFfYmF1bSwgc3RyYXRhID0gYW5uYWhtZSkNCg0KZGF0YV90cmFpbiA8LSB0cmFpbmluZyhkYXRhX3NwbGl0KQ0KZGF0YV90ZXN0IDwtIHRlc3RpbmcoZGF0YV9zcGxpdCkNCg0KDQojUHLDvGZlbiwgb2IgV2FocnNjaGVpbmxpY2hrZWl0ZW4gZXR3YSBnbGVpY2ggdmVydGVpbHQgc2luZA0KcHJvcC50YWJsZSh0YWJsZShkYXRhX3RyYWluJGFubmFobWUpKQ0KcHJvcC50YWJsZSh0YWJsZShkYXRhX3Rlc3QkYW5uYWhtZSkpDQpwcm9wLnRhYmxlKHRhYmxlKGRhdGFfYmF1bSRhbm5haG1lKSkNCg0KDQojUGFyYW1ldGVyIGbDvHIgQmF1bSANCnRyZWVfc3BlY3MgPC0gZGVjaXNpb25fdHJlZShtaW5fbiA9IDEwLHRyZWVfZGVwdGggPSA1ICkgJT4lIA0KICAgICAgICAgICAgIHNldF9lbmdpbmUoInJwYXJ0IikgJT4lIA0KICAgICAgICAgICAgICBzZXRfbW9kZSgiY2xhc3NpZmljYXRpb24iKQ0KDQojTW9kZWxsdm9yaGVyc2FnZSBtaXQgYWxsZW4gVmFyaWFibGVuIGltIERhdGVuc2V0DQptb2RlbF9hbGxlcyA8LSB0cmVlX3NwZWNzICU+JSANCiAgICAgICAgICBmaXQoZm9ybXVsYSA9IGFubmFobWUgfiAuLCBkYXRhID0gZGF0YV90cmFpbiApIA0KDQoNCiNNb2RlbGx2b3JoZXJzYWdlIG51ciBtaXQgcmVjaHRzZm9ybSAmIEphLUxhZ2VyDQptb2RlbF9icl9qYWxhZ2VyIDwtIHRyZWVfc3BlY3MgJT4lIA0KICAgICAgICAgIGZpdChmb3JtdWxhID0gYW5uYWhtZSB+IHJlY2h0c2Zvcm0gKyBqYS5sYWdlciwgZGF0YSA9IGRhdGFfdHJhaW4pIA0KDQojTW9kZWxsdm9yaGVyc2FnZSBudXIgbWl0IFJlY2h0c2Zvcm0gJiBCdW5kZXNyYXRzZW1wZmVobHVuZw0KbW9kZWxfYnJfcmVjaHRzZm9ybSA8LSB0cmVlX3NwZWNzICU+JSANCiAgICAgICAgICBmaXQoZm9ybXVsYSA9IGFubmFobWUgfiByZWNodHNmb3JtICsgYnIucG9zLCBkYXRhID0gZGF0YV90cmFpbikgDQoNCnByZWRfYWxsZXMgPC0gcHJlZGljdChtb2RlbF9hbGxlcywgbmV3X2RhdGEgPSBkYXRhX21haV9iYXVtKSAlPiUgcmVuYW1lKGFsbGVzID0gIi5wcmVkX2NsYXNzIikNCnByZWRfQlJfUmVjaHRzZm9ybSA8LSBwcmVkaWN0KG1vZGVsX2JyX3JlY2h0c2Zvcm0sIG5ld19kYXRhID0gZGF0YV9tYWlfYmF1bSkgJT4lICByZW5hbWUoQlJfUmVjaHRzZm9ybSA9ICIucHJlZF9jbGFzcyIpDQpwcmVkX0JSX0phTGFnZXIgPC0gcHJlZGljdChtb2RlbF9icl9qYWxhZ2VyLCBuZXdfZGF0YSA9IGRhdGFfbWFpX2JhdW0pICU+JSAgcmVuYW1lKEJSX0phTGFnZXIgPSAiLnByZWRfY2xhc3MiKQ0KDQpwcmVkaWN0KG1vZGVsX2FsbGVzLCBuZXdfZGF0YSA9IG9yZ2Fuc3BlbmRlKQ0KcHJlZGljdChtb2RlbF9hbGxlcywgbmV3X2RhdGEgPSBGcm9udGV4KQ0KcHJlZGljdChtb2RlbF9hbGxlcywgbmV3X2RhdGEgPSBmaWxtZ2VzZXR6KQ0KDQoNCnZvcmhlcnNhZ2VuIDwtIGNiaW5kKGRhdGFfbWFpX2JhdW0scHJlZF9hbGxlcywgcHJlZF9CUl9SZWNodHNmb3JtLCBwcmVkX0JSX0phTGFnZXIpICAlPiUgDQogIHNlbGVjdCgtYyhuci5wb3MsIHNyLnBvcywgYnYucG9zKSkgJT4lIA0KICByZW5hbWUoVGl0ZWwgPSB0aXRlbF9rdXJ6X2QpDQoNCg0KYGBgDQoNCg0KYGBge3J9IA0KI0VudHNjaGVpZHVuZ3NiYXVtIG51ciBtaXQgcnBhcnQgKGRhIEJhdW0gc29uc3QgbmljaHQgZ2VwbG90dGV0IHdlcmRlbiBrb25udGUpDQptb2RlbCA8LSBycGFydChhbm5haG1lIH4gLiwgZGF0YSA9IGRhdGFfYmF1bSwgbWV0aG9kID0gJ2NsYXNzJyxjb250cm9sPXJwYXJ0LmNvbnRyb2wobWluc3BsaXQgPSAxMiwgbWluYnVja2V0ID0gMTAsIGNwPTAuMDA5KSkNCg0KI1ZvcmhlcnNhZ2VuLCB3b2JlaSBkYXMgTW9kZWxsIHdpZWRlciBhbGxlIFZhcmlhYmxlbiBiZXLDvGNrc2ljaHRpZ3QNCnByZWRpY3QobW9kZWwsIGRhdGFfbWFpX2JhdW0sIHR5cGUgPSAnY2xhc3MnKQ0KcHJlZGljdChtb2RlbCwgb3JnYW5zcGVuZGUsIHR5cGUgPSAnY2xhc3MnKQ0KcHJlZGljdChtb2RlbCwgRnJvbnRleCwgdHlwZSA9ICdjbGFzcycpDQpwcmVkaWN0KG1vZGVsLCBmaWxtZ2VzZXR6LCB0eXBlID0gJ2NsYXNzJykNCnJwYXJ0LnBsb3QobW9kZWwsIGV4dHJhID0gImF1dG8iKQ0KDQoNCg0KYGBgDQoNCg0KDQoNCmBgYHtyfQ0KI1Zpc3VhbGlzaWVydW5nIFZlcnRlaWx1bmcgZGVyIFJlY2h0c2Zvcm1lbg0KZ2dwbG90KGRmX2NsZWFuLCBhZXMoeCA9IHJlY2h0c2Zvcm0pKSArDQogIGdlb21fYmFyKCkNCg0KDQpgYGANCg0KDQpgYGB7cn0NCiNLb3JyZWxhdGlvbiBiZXJlY2huZW4NCg0KY29yKGRhdGFfd2VyJGphLmxhZ2VyLCBkYXRhX3dlciRhbm5haG1lLCB1c2UgPSAiY29tcGxldGUub2JzIikNCg0KbGlicmFyeShyY29tcGFuaW9uKQ0KDQpkYXRhIDwtIHRhYmxlKGRmX2NsZWFuJHJlY2h0c2Zvcm0sIGRmX2NsZWFuJGJyLnBvcykNCmRhdGEyPC0gdGFibGUoZGZfY2xlYW4kamEubGFnZXIsIGRmX2NsZWFuJHJlY2h0c2Zvcm0pDQoNCmRhdGEyDQoNCg0KI2NhbGN1bGF0ZSBDcmFtZXIncyBWDQpjcmFtZXJWKGRhdGEpDQpjcmFtZXJWKGRhdGEyKQ0KDQpgYGANCg0KDQo=